package main

import (
	"fmt"
	"sync"
)

// Singleton
// @Description: 确保一个类只有一个实例，并提供一个全局访问点
func main() {
	d1 := GetSingleton()
	d2 := GetSingleton()
	d3 := GetSingleton()

	fmt.Printf("%p\n", d1)
	fmt.Printf("%p\n", d2)
	fmt.Printf("%p\n", d3)
}

type Singleton struct {
}

// 申明一个全局变量
var singleton *Singleton

var once sync.Once

// GetSingleton
//
//	@Description: 并提供一个全局访问点
//	@return *Singleton
func GetSingleton() *Singleton {
	once.Do(func() {
		singleton = &Singleton{}
	})
	return singleton
}
